<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script type="text/javascript">
      /*
        创建一个Person构造函数
          - 在Person构造器函数中,为每一个对象都添加了一个sayName方法
              目前我们的方法是在构造函数内部创建的,
                也就是构造函数每执行一次就会创建一个新的sayName方法
              也就是所有实例的sayName方法都是唯一的。
              这样就导致了构造函数执行一次就会创建一个新的方法
                执行10000次就会创建10000个新的方法,而10000个方法都是一模一样的
                这是完全没有必要的,完全可以使所有的对象共享同一个方法
      */
      function Person(name, age, gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        //像对象中添加一个方法
        this.sayName = fun;
      }

      //共享同一个方法,将sayName方法在全局作用域中定义
      /* 
        将函数定义在全局作用域中,污染了全局作用域的命名空间,容易覆盖掉已有的,同名的函数
          而且定义在全局作用域中也很不安全(所以尽量不要在全局作用域中定义函数)
      */
      function fun() {
        alert('Hello大家好,我是' + this.name);
      }

      //创建一个Person的实例
      var per = new Person('孙悟空', 18, '男');
      var per2 = new Person('猪八戒', 28, '男');

      per.sayName();
      per2.sayName();

      console.log(per.sayName == per2.sayName);
    </script>
  </head>
  <body></body>
</html>
